package main

import (
	"log"
	"sync"
	"time"
)

func main() {
	mu := &sync.Mutex{}
	cond := sync.NewCond(mu)

	// 两个需要满足的条件
	dataReady := false
	configLoaded := false

	// 模拟加载配置（1 秒后完成）
	go func() {
		time.Sleep(1 * time.Second)
		mu.Lock()
		log.Println("func configLoaded")
		configLoaded = true
		log.Println("配置加载完成")
		cond.Broadcast() // 通知等待者：配置已完成
		mu.Unlock()
	}()

	// 模拟准备数据（2 秒后完成）
	go func() {
		time.Sleep(2 * time.Second)
		mu.Lock()
		log.Println("func dataReady")
		dataReady = true
		log.Println("数据准备完成")
		cond.Broadcast() // 通知等待者：数据已完成
		mu.Unlock()
	}()

	// 等待两个条件都满足
	go func() {
		mu.Lock()
		log.Println("func1")
		// 循环判断：两个条件是否都为 true
		for !dataReady || !configLoaded { //golang 没有while，用for 循环替代了
			cond.Wait() // 释放锁，在这里等待其他线程调用 cond.Signal() 或 cond.Broadcast()
			log.Println("被唤醒，重新检查条件...")
		}
		// 两个条件都满足后，执行后续逻辑
		log.Println("所有条件满足，开始执行核心逻辑！")
		mu.Unlock()
	}()

	// 主线程阻塞（避免程序提前退出）
	time.Sleep(15 * time.Second)
}
